package com.example.tvhttp;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;
import java.util.List;

//****接口（如：OnItemClickListener）和实体类（如：ScreenInfo）及class类的实例化，需要使用new关键字来实例化。例如：NewsListAdapter mListAdapter = new NewsListAdapter(MainActivity.this);（摘自MainActivity文件）****

public class NewsListAdapter extends RecyclerView.Adapter<NewsListAdapter.MyHolder> {

    //list是一个接口类型，接口是一种抽象类型的定义，表示一个有序的、可以包含重复元素的集合。它主要用于规范一组方法签名，这些方法没有具体的实现代码。List接口继承自Collection接口,定义了一系列用于操作集合元素的方法，如add、remove、get等。
    //ArrayList是list(接口)的一种实现类，实现类的任务就是去实现这些接口或抽象类中定义的方法，从而赋予这些方法具体的行为逻辑。ArrayList内部是使用数组来存储元素的。它有一个Object[]类型的数组(Object指：对象、字符串、int等)，用于存放集合中的元素。

    //List<NewsInfo.ResultDTO.DataDTO>表示这个列表只能存储NewsInfo.ResultDTO.DataDTO类型的对象。如果尝试添加其他类型的对象，编译器会报错。

    //List<NewsInfo.ResultDTO.DataDTO>代表了mDataDTOS的数据类型为List（一个接口类型），**mDataDTOS为程序内部数据源**
    private List<NewsInfo.ResultDTO.DataDTO> mDataDTOS = new ArrayList<>();
    private Context mContext;

    //构造函数。构造函数的名称必须与类的名称完全相同。当使用new关键字创建一个对象时(例如：NewsListAdapter adapter = new NewsListAdapter(context))，
    // 构造函数NewsListAdapter会自动被调用,并传入参数Context。构造函数负责设置对象的初始状态，例如初始化成员变量。(构造函数不能有返回类型，甚至不能是void。它的目的是初始化对象，而不是返回一个值)。
    public NewsListAdapter(Context mContext) {
        this.mContext = mContext;
    }

    //为adapter 设置数据源

    public void setListData(List<NewsInfo.ResultDTO.DataDTO> list){
        this.mDataDTOS = list;

        //这句不可或缺。用于通知RecyclerView的适配器（Adapter）数据已发生变化的方法。当调用notifyDataSetChanged()时，它会触发RecyclerView重新绘制其所有可见的列表项。
        notifyDataSetChanged();
    }


    @NonNull
    @Override
    //MyHolder为函数返回值类型。
    public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //布局加载器（布局加载器通常指的是用于加载布局文件并创建视图层次结构的工具。LayoutInflater是一种加载布局的方法，LayoutInflater是 Android 中用于将 XML 布局文件转换为实际视图对象的类。可以通过Context获取LayoutInflater实例，并使用它来加载布局文件）
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,null);

        //初始化MyHolder。将view传入类MyHolder的构造函数（public MyHolder(@NonNull View itemView) ）中
        return new MyHolder(view);
    }

    //public MyHolder onCreateViewHolder函数的返回值，会以参数形式进入public void onBindViewHolderhan函数。
    //onBindViewHolder方法负责将数据绑定到RecyclerView的视图持有者上。当RecyclerView需要显示某个位置的项时，onBindViewHolder方法会被调用。
    @Override
    public void onBindViewHolder(@NonNull MyHolder holder, int position) {

        //绑定数据

        //从适配器内部存储数据源mDataDTOS中，根据传入的位置参数position获取对应的新闻数据对象
        NewsInfo.ResultDTO.DataDTO dataDTO  = mDataDTOS.get(position);

        holder.title.setText(dataDTO.getTitle());
        holder.author_name.setText(dataDTO.getAuthor_name());
        holder.date.setText(dataDTO.getDate());
        //glide用来加载图片
        Glide.with(mContext).load(dataDTO.getThumbnail_pic_s02()).error(R.mipmap.ic_launcher).into(holder.thumbnail_pic_s);

    }

    @Override
    public int getItemCount() {
        return mDataDTOS.size();
    }

    static class MyHolder extends RecyclerView.ViewHolder{

        ImageView thumbnail_pic_s;
        TextView title;
        TextView author_name;
        TextView date;

        //构造函数
        public MyHolder(@NonNull View itemView) {
            super(itemView);

            //找到控件
            thumbnail_pic_s = itemView.findViewById(R.id.thumbnail_pic_s);
            title = itemView.findViewById(R.id.title);
            author_name = itemView.findViewById(R.id.author_name);
            date = itemView.findViewById(R.id.date);
        }
    }
}
